% $Header: /cvsrepos/html2ps/postscript/box.list-item.ps,v 1.1 2008/07/01 12:33:05 sergey Exp $

/box-list-item-height-koeff 0.7 def
/box-list-item-bullet-size-koeff 0.15 def

/box-list-item-create {
  box-block-create
  
  dup /MarkerImage /null put
  dup /MarkerString ( ) put
  
  dup box-list-item-setup-methods
  dup /box-list-item add-type
} def

/box-list-item-get-marker-box-width { % => ListItem
  dup /list-style get-css-value
  /type get {                         % => ListItem Type
    dup /none eq { pop 0 exit } if
    
    dup /disc eq
    1 index /circle eq or
    1 index /square eq or { pop dup /font-size get-css-value exit } if

    pop
    
    dup /font-family get-css-value
    1 index /font-size get-css-value
    scalefont
    setfont

    dup box-list-item-get-string
    stringwidth pop                   % => ListItem Width
  } loop                              % => ListItem Width
  exch pop                            % => Width
} def

/box-list-item-get-marker-image {
  /MarkerImage get
} def

/box-list-item-get-string {
  /MarkerString get
} def

/box-list-item-put-marker-image {  % => Image This
  exch /MarkerImage exch put
} def

/box-list-item-put-string {
  exch /MarkerString exch put
} def

/box-list-item-reflow {            % => Context Parent Box
% If list-style-position is inside, we'll need to move marker box inside the 
% list-item box and offset all content by its size;
  dup /list-style get-css-value /position get
  /inside eq {
% Add marker box width to text-indent value
    dup box-list-item-get-marker-box-width
    1 index put-additional-text-indent
  } if
  
  3 copy box-block-reflow
  pop pop pop
} def

/box-list-item-show {              % => Viewport This
% Draw generic block box
  2 copy box-container-show

% Draw marker 
% Determine the marker box base X coordinate
  dup get-left                     % => Viewport This MX

% Determine the base Y coordinate of marker box
  1 index box-container-get-first-data
  dup /null ne {                   % => Viewport This MX Element
    dup get-top
    1 index get-default-baseline sub
    exch pop        
  } {                              % => Viewport This MX /null
    pop
    1 index get-top
  } ifelse                         % => Viewport This MX MY

% If list-style-position is inside, we'll need to move marker box inside the 
% list-item box and offset all content by its size;
  2 index /list-style get-css-value /position get
  /inside eq {
    2 index box-list-item-get-marker-box-width
    2 index add                    % => Viewport This MX MY MX'
    3 2 roll pop
    exch
  } if

  2 index box-list-item-get-marker-image 
  /null ne {                       % => Viewport This MX MY 
    exch 3 index 3 index
    box-list-item-show-image 
  } {                              % => Viewport This MX MY 
    exch
    3 index 3 index                % => Viewport This MY MX Viewport This
    dup /list-style get-css-value /type get
    {
      dup /none eq   { pop pop pop pop pop exit } if
      dup /disc eq   { pop box-list-item-show-disc exit } if
      dup /circle eq { pop box-list-item-show-circle exit } if
      dup /square eq { pop box-list-item-show-square exit } if
      pop box-list-item-show-string exit
    } loop
  } ifelse                         % => Viewport This

  pop pop
} def

/box-list-item-setup-methods {     % => Box
  dup /Methods get
  dup /reflow {box-list-item-reflow} put
  dup /show   {box-list-item-show} put
  pop pop
} def

/box-list-item-show-circle {       % => MY MX Viewport This
  dup /color get-css-value
  color-apply

  0.1 setlinewidth
  
  dup /font-size get-css-value
  2 div neg
  3 index add                      % => MY MX Viewport This X

  1 index /font-size get-css-value
  0.4 mul
  box-list-item-height-koeff mul
  5 index add                      % => MY MX Viewport This X Y 
  
  2 copy newpath moveto

  2 index /font-size get-css-value
  box-list-item-bullet-size-koeff mul
                                   % => MY MX Viewport This X Y R
  
  0 360 arc closepath stroke

  pop pop pop pop
} def

/box-list-item-show-disc {         % => MY MX Viewport This
  dup /color get-css-value
  color-apply

  dup /font-size get-css-value
  2 div neg
  3 index add                      % => MY MX Viewport This X

  1 index /font-size get-css-value
  0.4 mul
  box-list-item-height-koeff mul
  5 index add                      % => MY MX Viewport This X Y 

  2 copy newpath moveto
  
  2 index /font-size get-css-value
  box-list-item-bullet-size-koeff mul
                                   % => MY MX Viewport This X Y R
  
  0 360 arc closepath fill
  
  pop pop pop pop
} def

/box-list-item-show-image {        % => MY MX Viewport This
  dup box-list-item-get-marker-image
                                   % => MY MX Viewport This Image
  3 index
  5 index moveto                   % => MY MX Viewport This Image

  dup /SX get px
  1 index /SY get px
  2 index 
  image-show                       % => MY MX Viewport This Image

  pop pop pop pop pop
} def

/box-list-item-show-square {       % => MY MX Viewport This
  dup /color get-css-value
  color-apply

  2 index
  1 index /font-size get-css-value
  0.512 mul sub

  4 index
  2 index /font-size get-css-value
  0.3 mul
  box-list-item-height-koeff mul add

  2 index /font-size get-css-value 0.25 mul
  3 index /font-size get-css-value 0.25 mul
    
  rectfill
    
  pop pop pop pop
} def

/box-list-item-show-string {       % => MY MX Viewport This
  box-text-create                  % => MY MX Viewport This TextBox
  
  1 index box-list-item-get-string % => MY MX Viewport This TextBox String
  1 index put-text                 % => MY MX Viewport This TextBox 

  1 index
  /font-family get-css-value       % => MY MX Viewport This TextBox Font
  1 index exch
  /font-family exch put-css-value  % => MY MX Viewport This TextBox 

  1 index
  /font-size get-css-value         % => MY MX Viewport This TextBox FontSize
  1 index exch
  /font-size exch put-css-value    % => MY MX Viewport This TextBox 

  1 index
  /color get-css-value             % => MY MX Viewport This TextBox Color
  1 index exch
  /color exch put-css-value        % => MY MX Viewport This TextBox 

  dup box-text-setup               % => MY MX Viewport This TextBox

  dup get-default-baseline
  1 index put-baseline

  4 index
  1 index get-baseline add
  4 index
  2 index get-full-width sub       % => MY MX Viewport This TextBox MY MX
  2 index
  box-generic-move-to              % => MY MX Viewport This TextBox 

  2 index exch
  box-text-show                     
    
  pop pop pop pop
} def